//

let identifier = 0; // 用来表示学生编号的变量

const qs = require('querystring'); // 导入 querystring 模块

const dateformat = require('dateformat');

const pseudoDatabase = require('./pseudo-database.js'); // 导入自定义模块
const Student = pseudoDatabase.Student;
const students = pseudoDatabase.students;

const Student = pseudoDatabase.Student; //模块中导出的变量 Student

const students = pseudoDatabase.students; //模块中导出的变量student

// 注意，这里导入的 router 模块实际上是个构造函数
const Router = require('router'); // 导入第三方模块: router

const router = new Router(); // 将 Router 当作构造函数使用
// const router = Router(); // 将 Router 当作普通函数调用
// console.log(router);
// console.log(Object.getOwnPropertyNames(router));

// if (req.method === 'POST' && x.path === '/add')
router.post('/add', (req, resp) => {
    let chunk = []; // 声明一个数组用来保存缓冲区
    req.on('data', (buf) => {
        chunk.push(buf); // 将缓冲区依次添加到chunk数组中
    });
    req.on('end', () => {
        let buffer = Buffer.concat(chunk); // 将数组中所有缓冲区连接成一个大缓冲区
        let str = buffer.toString(); // 将缓冲区解码为字符串
        let params = qs.decode(str); // 使用 querystring 模块提供的支持解析 字符串为 Objet实例
        console.log(params);
        // 来自请求参数的 params.birthdate 必须是符合 yyyy-MM-dd 格式
        params.birthdate = new Date(params.birthdate);
        console.log(params);
        let stu = new Student(++identifier);
        console.log(stu);
        Object.assign(stu, params); // 将params中属性值复制到stu相应的属性
        console.log(stu);
        students.push(stu);
        // 重定向到 /list
        resp.writeHead(302, { 'location': '/list' });
        resp.end();
    });

});

// if (req.method === 'GET' && x.path === '/list')
router.get('/list', (req, resp) => {

    let content = '<link rel="stylesheet" href="/css/tab.css">';

    content += '<table class="tab">';

    if (students.length == 0) {
        content += '<tr><td colspan="5">暂无数据</td></tr>';
    } else {
        students.forEach(stu => {
            content += `<tr>
                            <td>${stu.id}</td>
                            <td>${stu.name}</td>
                            <td>${stu.gender === 'male' ? '靓仔' : '靓妹'}</td>
                            <td>${dateformat(stu.birthdate,'yyyy年mm月dd日')}</td>
                            <td>
                                <a href="/update?id=${stu.id}">修改</a>
                                <a href="/remove?id=${stu.id}">删除</a>
                            </td>
                        </tr>`;
        });
    }

    content += '<tr><td colspan="5"><a href="/add.html">添加学生</a></td></tr>';

    content += '</table>';

    // 设置 响应状态代码(200) 和 响应头(content-type)
    resp.writeHead(200, { 'content-type': 'text/html;charset=UTF-8' });
    // 设置 响应正文
    resp.write(content);
    // 让响应结束
    resp.end();
});

// if (req.method === 'GET' && x.path === '/remove')
router.get('/remove', (req, resp) => {

    let input = req.url; // 从请求对象中获得本次请求路径
    let base = `http://${req.headers.host}`; // 从请求头中获得host字段的值
    // 这里使用 new URL 替代了 被废弃的 url.parse
    let url = new URL(input, base); // 在 global 上有一个 URL 对象
    let params = url.searchParams;
    if (params.has('id')) {
        let id = params.get('id');
        id = id * 1;

        let index = -1;
        for (let i = 0; i < students.length; i++) {
            // 通过对比id来确定被删除的元素索引
            if (students[i].id === id) {
                index = i;
                break;
            }
        }

        if (index != -1) {
            students.splice(index, 1);
        }
    }

    // 重定向到 /list
    resp.writeHead(302, { 'location': '/list' });
    resp.end();
});

router.get('/update', (req, resp) => {

    resp.writeHead(200, { 'content-type': 'text/html;charset=UTF-8' });

    let input = req.url; // 从请求对象中获得本次请求路径
    let base = `http://${req.headers.host}`; // 从请求头中获得host字段的值
    // 这里使用 new URL 替代了 被废弃的 url.parse
    let url = new URL(input, base); // 在 global 上有一个 URL 对象
    let params = url.searchParams;
    if (params.has('id')) {
        let id = params.get('id');
        id = id * 1;

        let s = null;
        for (let i = 0; i < students.length; i++) {
            let stu = students[i];
            // 通过对比id来确定即将被修改的元素索引
            if (stu.id === id) {
                s = stu;
                break;
            }
        }


        let content = `<form action="/update" method="post">
                            <input type="hidden" name="id" value="${s.id}">
                            <input type="text" name="name" value="${s.name}">
                            <input type="radio" name="gender" value="male" 
                                   ${s.gender === 'male' ? 'checked' : ''}> 靓仔
                            <input type="radio" name="gender" value="female" 
                                   ${s.gender === 'female' ? 'checked' : ''}> 靓妹
                            <input type="date" name="birthdate" value="${dateformat(s.birthdate,'yyyy-mm-dd')}">
                            <input type="submit" value="修改">
                        </form>`;

        resp.write(content);
    }
    resp.end();
});

router.post('/update', (req, resp) => {
    let chunk = []; // 声明一个数组用来保存缓冲区
    req.on('data', (buf) => {
        chunk.push(buf); // 将缓冲区依次添加到chunk数组中
    });
    req.on('end', () => {
        let buffer = Buffer.concat(chunk); // 将数组中所有缓冲区连接成一个大缓冲区
        let str = buffer.toString(); // 将缓冲区解码为字符串
        let params = qs.decode(str); // 使用 querystring 模块提供的支持解析 字符串为 Objet实例
        params.id = params.id * 1; // 将参数接受到的id由string转为number
        // 来自请求参数的 params.birthdate 必须是符合 yyyy-MM-dd 格式
        params.birthdate = new Date(params.birthdate);

        for (let i = 0; i < students.length; i++) {
            // 通过对比id来确定被修改的元素索引
            if (students[i].id === params.id) {
                // 将params中属性值复制到students[i]相应的属性
                Object.assign(students[i], params);
                break;
            }
        }
    });
    // 重定向到 /list
    resp.writeHead(302, { 'location': '/list' });
    resp.end();
});

// if (req.method === 'GET' && x.path === '/')
router.get('/', (req, resp) => {
    resp.writeHead(302, { 'location': '/list' });
    resp.end();
});


module.exports = router;